﻿using System;
using System.Collections.Generic;

namespace Configurator
{
    /// <summary>
    /// Элемент конфигурации.
    /// </summary>
    public class Item
    {
        /// <summary>
        /// Имя элемента.
        /// </summary>
        private string name;

        /// <summary>
        /// Список подэлементов элемента.
        /// </summary>
        private List<SubItem> subItems;

        /// <summary>
        /// Инициализирует элемент конфигурации.
        /// </summary>
        /// <param name="name">Имя элемента.</param>
        /// <param name="subItems">Список подэлементов.</param>
        public Item(string name, List<SubItem> subItems)
        {
            if (string.Empty == name)
            {
                throw new System.ArgumentException("Имя элемента не может быть пустым.");
            }

            this.name = name;
            this.subItems = subItems;
        }

        /// <summary>
        /// Возвращает или задает имя элемента.
        /// </summary>
        public string Name
        {
            get { return this.name; }
            set { this.name = value; }
        }

        /// <summary>
        /// Возвращает или задает список подэлементов элемента.
        /// </summary>
        public List<SubItem> SubItems
        {
            get { return this.subItems; }
            set { this.subItems = value; }
        }

        /// <summary>
        /// Добавляет подэлемент к элементу.
        /// </summary>
        /// <param name="newSubItem">Добавляемый подэлемент.</param>
        /// <returns>Возвращает true, если подэлемент успешно добавился и false, если подэлемент с таким именем уже есть.</returns>
        public bool AddSubItem(SubItem newSubItem)
        {
            if (newSubItem == null)
            {
                throw new System.ArgumentException("Добавляемый подэлемент = null.");
            }

            if (this.SubItems.Contains(newSubItem))
            {
                return false;
            }

            this.subItems.Add(newSubItem);

            return true;
        }

        /// <summary>
        /// Удаляет указанный подэлемент из элемента.
        /// </summary>
        /// <param name="subItem">Удаляемый подэлемент.</param>
        /// <returns>Значение true, если подэлемент успешно удален, в противном случае — значение false.</returns>
        public bool RemoveSubItem(SubItem subItem)
        {
            if (null == subItem)
            {
                throw new System.ArgumentNullException("Удаляемый подэлемент = null.");
            }

            return this.SubItems.Remove(subItem);
        }

        /// <summary>
        /// Возвращает подэлемент с указанным именем.
        /// </summary>
        /// <param name="name">Имя подэлемента.</param>
        /// <returns>Возвращает подэлемент если он найден, null если такого подэлемент нет.</returns>
        public SubItem GetSubItemWithName(string name)
        {
            if (string.Empty == name)
            {
                throw new ArgumentException("Имя не может быть пустым.");
            }

            for (int i = 0; i < this.SubItems.Count; ++i)
            {
                if (name == this.SubItems[i].Name)
                {
                    return this.SubItems[i];
                }
            }

            return null;
        }

        /// <summary>
        /// Сортирует список подэлементов по имени.
        /// </summary>
        public void SortSubItem()
        {
            this.subItems.Sort((a, b) => a.Name.CompareTo(b.Name));
        }

        /// <summary>
        /// Возвращает текстовое представление элемента.
        /// </summary>
        /// <returns>Возвращает текстовое представление объекта.</returns>
        public override string ToString()
        {
            return this.name;
        }
    }
}
